
package com.monlyu.tag.extend;

import java.util.Set;

import com.google.common.collect.Sets;
import com.monlyu.tag.BaseTag;
import com.monlyu.util.PermissUtil;
import com.monlyu.util.StringUtil;
import com.monlyu.util.WebOptUtil;

/********************************************************************************
 * <b>功能描述☞</b>权限标签<br>
 * <b>开发公司☞</b>重庆唯尼科技有限公司<br>
 * <b>版权☞</b>本文件归重庆唯尼科技有限公司所有<br>
 * <b>项目名☞</b>monlyu<br>
 * <b>文件路径☞</b>com.monlyu.tag.extend.PermissTag.java<br>
 * <b>开发日期☞</b>2010-1-31 <br>
 * 
 * @author monlyu
 * @since JDK 5
 * @version 1.0.8
 ********************************************************************************/
public class PermissTag extends BaseTag {

    // 或且
    private static String OR = "=";
    // 并且
    private static String AND = "#";

    private static boolean isOr;

    // 权限列表
    private String permiss;

    // Bean的属性对象等于当前用户的ID值
    private String objEqlUid;

    public void setObjEqlUid(String objEqlUid){
        this.objEqlUid = objEqlUid;
    }

    public void setPermiss(String permiss){
        this.permiss = permiss;
    }

    /**
     * @author monlyu
     * @since 2009-12-27
     */
    @Override
    public int doStartTag(){
        if (StringUtil.isTrimEmpty(objEqlUid)) {
            return checkPermis();
        }
        // 这一部分是判断 当前用户的Id和需要的Id是否为一致的
        if (StringUtil.isTrimEmpty(permiss)) {
            return checkUid();
        }
        if (checkUid() == SKIP_BODY) {
            return SKIP_BODY;
        } else {
            return checkPermis();
        }
    }

    /**
     * 如果当前用户等于 当前用户
     * 
     * @author monlyu
     * @since 2010-2-1
     */
    private int checkUid(){
        if (!StringUtil.isEmpty(objEqlUid)) {
            Object destVal = getValueFromValueStack(objEqlUid);
            if (WebOptUtil.curUser().getId().toString().equals(destVal.toString())) {
                return EVAL_BODY_INCLUDE;
            }
        }
        return SKIP_BODY;
    }

    /**
     * 检查权限
     * 
     * @author monlyu
     * @since 2010-2-1
     */
    private int checkPermis(){
        if (WebOptUtil.APP_ARGS.isDebug()) {
            return EVAL_BODY_INCLUDE;
        }
        if (PermissUtil.cheakPermis(isOr, analytics())) {
            return EVAL_BODY_INCLUDE;
        }
        return SKIP_BODY;
    }

    /**
     * 分析字符串,查看里面包含的权限
     * 
     * @author monlyu
     * @since 2010-1-31
     */
    private Set<String> analytics(){
        Set<String> set = Sets.newLinkedHashSet();
        int OR_INDEX = permiss.indexOf(OR);
        int AND_INDEX = permiss.indexOf(AND);
        if (OR_INDEX > 0 && AND_INDEX > 0) {
            set.add("NO_SUCH_PERMISE");// 加入特殊的无效权限
            return set;
        } else {
            if (OR_INDEX > 0) {
                isOr = true;
                String[] misses = permiss.split(OR);
                for (int i = 0; i < misses.length; i++) {
                    set.add(misses[i]);
                }
                return set;
            }
            if (AND_INDEX > 0) {
                for (String miss : permiss.split(AND)) {
                    set.add(miss);
                }
                return set;
            }
            set.add(permiss);
        }
        return set;
    }
}